<?php
if (! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );
/*
 * $Id$ 验证码模块 
 * 修正session问题，by rongbb@20140509
 */
// session_start();
class M_validationcode extends CI_Model {
	private $width, $height, $codenum;
	public $checkcode; // 产生的验证码
	private $checkimage; // 验证码图片
	private $disturbColor = ''; // 干扰像素
	function __construct($width = '60', $height = '22', $codenum = '4') {
// 		$this->load->library ( 'session' );
		$this->width = $width;
		$this->height = $height;
		$this->codenum = $codenum;
	}
	function outImg($lenth, $width, $num) {
		$this->width = $lenth;
		$this->height = $width;
		$this->codenum = $num;
		// 输出头
		$this->outFileHeader ();
		// 产生验证码
		$this->createCode ();
		// 产生图片
		$this->createImage ();
		// 设置干扰像素
		$this->setDisturbColor ();
		// 往图片上写验证码
		$this->writeCheckCodeToImage ();
		$this->writeSession ();
		imagepng ( $this->checkimage );
		imagedestroy ( $this->checkimage );
	}
	private function outFileHeader() {
		//header ( "cache-control:no-cache,must-revalidate" );
		header ( "Content-type: image/png" );
	}
	private function createCode() {
		$rand = preg_replace ( '/[0oO]+/isU', '', md5 ( rand () ) );
		$str = strtoupper ( substr ( $rand, 0, $this->codenum ) );
		/*
		 * if(ereg('([0oO]?)',$str)){ $this->createCode(); }else{ $this->checkcode = $str; unset($str); }
		 */
		$this->checkcode = $str;
// 		$_SESSION ['valicode'] = $str;
	}
	private function createImage() {
		$this->checkimage = @imagecreate ( $this->width, $this->height );
		$back = imagecolorallocate ( $this->checkimage, 255, 255, 255 );
		$border = imagecolorallocate ( $this->checkimage, 214, 214, 214 );
		imagefilledrectangle ( $this->checkimage, 0, 0, $this->width - 1, $this->height - 1, $back ); // 白色底
			                                                                                      // imagerectangle($this->checkimage,0,0,$this->width - 1,$this->height - 1,$border); // 黑色边框
	}
	private function setDisturbColor() {
		for($i = 0; $i <= 200; $i ++) {
			$this->disturbColor = imagecolorallocate ( $this->checkimage, rand ( 0, 255 ), rand ( 0, 255 ), rand ( 0, 255 ) );
			imagesetpixel ( $this->checkimage, rand ( 2, 128 ), rand ( 2, 38 ), $this->disturbColor );
		}
	}
	private function writeCheckCodeToImage() {
		for($i = 0; $i < $this->codenum; $i ++) {
			$bg_color = imagecolorallocate ( $this->checkimage, rand ( 0, 255 ), rand ( 0, 186 ), rand ( 0, 255 ) );
			$x = rand ( 0, 7 ) + floor ( $this->width / $this->codenum ) * $i;
			$y = rand ( 0, $this->height - 15 );
			imagechar ( $this->checkimage, rand ( 5, 8 ), $x, $y, $this->checkcode [$i], $bg_color );
		}
	}
	private function writeSession() {
// 		$_SESSION ['valicode'] = $this->checkcode;
		// $CI = &get_instance ();
		// $CI->load->library ( 'session' );
		$sess_date ['valcode'] = $this->checkcode;
		$this->session->set_userdata ( $sess_date );
// 		return;
	}
	function __destruct() {
		//unset ( $this->width, $this->height, $this->codenum );
	}
}    
